﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Promocot.Models;

namespace Promocot.Controllers
{
    public class HomeController : Controller
    {

        ClientomaticDBContainer dbQuery = new ClientomaticDBContainer();

        /**/
        public ActionResult Index()
        {
            RegistroUsuario nuevo_usuario = new RegistroUsuario();
            return View(nuevo_usuario);
        }

        public ActionResult opciones() {

            ViewBag.empresas = dbQuery.EmpresaSet.ToList<Empresa>();
            ViewBag.usuarios = dbQuery.UsuarioSet.ToList<Usuario>();
            ViewBag.roles = dbQuery.RolSet.ToList<Rol>();

           return View();
        }

        public string Upload(HttpPostedFileBase fileData)
        {
            var fileName = this.Server.MapPath("~/Content/Recursos/" + System.IO.Path.GetFileName(fileData.FileName));
            fileData.SaveAs(fileName);

            return "ok";
        }

     
        public ActionResult RegistrarEmpresa(RegistroUsuario actual) {

           //si las claves no concuerdan, entonces regreso al menu principal.

            if (!actual.clave_reg.Equals(actual.conf_clave)) {
                return JavaScript("alert('Las claves introducidas son incorrectas.');$('#clave_reg').focus();");
            }

            try
            {
                //registro a la empresa
                Empresa cliente = new Empresa();
                cliente.nombre_empresa = actual.empresa.ToLower();//lowercase
                Empresa buscar = dbQuery.EmpresaSet.Where(emp => emp.nombre_empresa.Equals(cliente.nombre_empresa)).FirstOrDefault<Empresa>();
                if (buscar == null)
                {
                    dbQuery.EmpresaSet.AddObject(cliente);

                    if (ModelState.IsValid)
                    {
                        dbQuery.SaveChanges();
                    }
                }
                //rgistro de usuario.
                Usuario nuevo_usuario = new Usuario();
                nuevo_usuario.nombre = actual.nombre;
                nuevo_usuario.apellido = actual.apellido;
                nuevo_usuario.login = actual.login_reg;
                nuevo_usuario.password = actual.clave_reg;
                nuevo_usuario.cod_empresa = buscar.cod_empresa;
                nuevo_usuario.email = actual.correo;
                nuevo_usuario.telefono = actual.telefono;

                nuevo_usuario.activo = true;
                nuevo_usuario.cod_recordatorio = "nada";
                nuevo_usuario.cod_recordatorio_encriptado = "nada";
                nuevo_usuario.descripcion = "nada";
                nuevo_usuario.pregunta_olvido_password = "ninguna";
                nuevo_usuario.respuesta_olvido_password = "ninguna";
                nuevo_usuario.salt = true;
                nuevo_usuario.cod_recordatorio = "nada";
                nuevo_usuario.cod_recordatorio_encriptado = "nada";
                nuevo_usuario.observaciones = "nada";

                dbQuery.UsuarioSet.AddObject(nuevo_usuario);
                
                    dbQuery.SaveChanges();
                

                var op = "$(function () { alert('Bienvenido "+nuevo_usuario.nombre+"!');$(\"#stepregistered\").click(); $('#login').val('" + nuevo_usuario.nombre + "');$('#clave').val('" + nuevo_usuario.password + "');});";
                return JavaScript(op);
            }
            catch (Exception) {

                return JavaScript("alert('Ha ocurrido un error interno en el registro de Empresa ");
            }
        }

        public ActionResult Agregar_Usuario() {
            Usuario nuevo_user = new Usuario();
            ViewBag.roles = dbQuery.RolSet.ToList<Rol>();
            ViewBag.departamentos = dbQuery.DepartamentoSet.ToList<Departamento>();
            return View(nuevo_user);
        }

        [HttpPost]
        public ActionResult Cargar_Usuario(Usuario actual) {

            int rol = int.Parse(this.Request.Form.Get("rol"));
            Rol obtenido = dbQuery.RolSet.Single(ro => ro.cod_rol == rol);
            int depart = int.Parse(this.Request.Form.Get("departamento"));

            if (actual.cod_usuario == 0)
            {
                actual.observaciones = "ninguna";
                actual.activo = false;
                actual.pregunta_olvido_password = "2+2?";
                actual.respuesta_olvido_password = "4";
                actual.salt = false;
                actual.cod_recordatorio_encriptado = "recordatorio";
                actual.cod_recordatorio = "recordatorio";
                actual.cod_empresa = Int32.Parse((Session["empresaID"]).ToString());
                actual.RolSet = obtenido;
                actual.Departamento = dbQuery.DepartamentoSet.Single(dep => dep.Id == depart);

                dbQuery.UsuarioSet.AddObject(actual);

               /* if (ModelState.IsValid)
                {*/
                    dbQuery.SaveChanges();
                    return RedirectToAction("ListarUsuarios", "Home");
                /*}*/
            }
            else {
                Usuario buscar = dbQuery.UsuarioSet.Where(usu => usu.cod_usuario == actual.cod_usuario).Single<Usuario>();
                buscar.RolSet = obtenido;
                buscar.Departamento = dbQuery.DepartamentoSet.Single(dep => dep.Id == depart);
                /*if (TryUpdateModel(buscar)){*/
                    
                    dbQuery.SaveChanges();
                /*}*/
            }


            return RedirectToAction("ListarUsuarios", "Home");
        }


        public ActionResult ListarUsuarios() {

            int id = (int)Session["empresaID"];
            List<Usuario> usuarios = dbQuery.UsuarioSet.Where(us => us.cod_empresa == id).ToList<Usuario>();

            return View(usuarios);
        }

        public ActionResult Activar(Int32 id) 
        {
            Usuario activ = dbQuery.UsuarioSet.Where(us => us.cod_usuario == id).Single<Usuario>();
            activ.activo = true;
            if (TryUpdateModel(activ)) {
                dbQuery.SaveChanges();
                return RedirectToAction("ListarUsuarios", "Home");
            }
            return RedirectToAction("ListarUsuarios", "Home");
        }
        
        public ActionResult Desactivar(Int32 id)
        {
            Usuario activ = dbQuery.UsuarioSet.Where(us => us.cod_usuario == id).Single<Usuario>();
            activ.activo = false;
            if (TryUpdateModel(activ))
            {
                dbQuery.SaveChanges();
                return RedirectToAction("ListarUsuarios", "Home");
            }
            return RedirectToAction("ListarUsuarios", "Home");
        }


        public ActionResult Clasificaciones() {

            List<Clasificacion> clasificaciones = dbQuery.ClasificacionSet.ToList<Clasificacion>();

            return View(clasificaciones);
        }

        public ActionResult Monedas() {

            List<Moneda> monedas = dbQuery.MonedaSet.ToList<Moneda>();
            return View(monedas);
        }


        public String GetClasPadre(Int32 num) {

            String res = " - ";
            Clasificacion find = dbQuery.ClasificacionSet.Where(cla => cla.cod_clasificacion == num).Single<Clasificacion>();

            if (find.cod_clasificacion_padre != 1) {

                Clasificacion padre = dbQuery.ClasificacionSet.Where(cla => cla.cod_clasificacion == find.cod_clasificacion_padre).Single<Clasificacion>();
                res= padre.nombre;
            }
            return res;
        }

        public ActionResult Eliminar_Moneda(Int32 id) {
            Moneda a_elim = dbQuery.MonedaSet.Where(mon => mon.cod_moneda == id).Single<Moneda>();

            dbQuery.MonedaSet.DeleteObject(a_elim);
            dbQuery.SaveChanges();

            return RedirectToAction("Monedas");
        }

        public ActionResult Recursos() {

            List<Recurso> recursos = dbQuery.RecursoSet.ToList<Recurso>();

            return View(recursos);
        }

        public ActionResult Editar(Int32 id) {

            Usuario editUsuario = dbQuery.UsuarioSet.Where(usu => usu.cod_usuario == id).Single<Usuario>();
            ViewBag.roles = dbQuery.RolSet.ToList<Rol>();
            ViewBag.departamentos = dbQuery.DepartamentoSet.ToList<Departamento>();
            return View("Agregar_Usuario", editUsuario);
        }
    }
}
